namespace test07 {
    // naver类型 
    // 表示不应该存在的状态

    // 返回never 的函数必须存在无法达到的终点

    // 因为必定抛出异常，所以 error将不会有返回值
    function error(message: string): never {
        throw new Error(message);
    }

    // 因为存在死循环，所以 loop 将不会有返回值
    function loop(): never {
        while (true) {

        }
    }

    // never 与 void 的差异
    // void类型只是没有返回值，但本身不会出错
    function Void(): void {
        console.log();

    }

    // never只会抛出异常，没有返回值
    function Never(): never {
        throw new Error("aaa");

    }

    // 应用场景
    interface A {
        type: 'foo'
    }
    interface B {
        type: 'bar'
    }
    interface C {
        type: 'bizz'
    }
    type All = A | B | C
    function handleValue(val: All) {
        switch (val.type) {
            case 'foo':
                console.log('Handling A'); // Handling A
                break;
            case 'bar':
                console.log('Handling B');
                break;
            case 'bizz':
                // 处理 C 类型  
                console.log('Handling C');
                break;
            default:
                // 兜底逻辑 一般是不会进入这儿 如果进来了就是程序异常了
                const exhaustiveCheck: never = val;
                throw new Error('Non-exhaustive match');
                break;
        }
    }
    handleValue({ type: 'foo' } as A);
    handleValue({ type: 'bar' } as B);
    handleValue({ type: 'bizz' } as C);

}